// await page.getByRole('cell', { name: '1' }).nth(1).click();
import { test, expect } from '@playwright/test';
import { FORM } from './index.js';
import { dragDom } from '../utils.js';

export const generate = async (page, type, options) => {
  switch (type) {
    case 'workshop':
      return await createWorkshop(page, options);
    case 'line':
      return await createLine(page, options);
    case 'workOrder':
      return await createWO(page, options);
    case 'section':
      return await createSection(page, options.poductSectionName, options.sectionName);
    case 'productSection':
      return await createProductSection(page, options.productPartNo, options.sectionName);
    case 'station':
      return await createStation(page, options.stationType, options.sectionName, options.index);
    case 'calendar':
      return await createCalendar(page, options.workTimeName, options.calendarName, options.poductSectionName);
    default:
      throw new Error(`Unsupported type: ${type}`);
  }
};
// 生成车间
const createWorkshop = async (page, { name, code }) => {
  await page.goto(`/#/admin/workshop`);
  await page.getByRole('button', { name: ' 新 增' }).click();
  await page.locator('[aria-label="新 增"] [placeholder="请输入 车间编码"]').fill(code);
  await page.locator('[aria-label="新 增"] [placeholder="请输入 车间名称"]').fill(name);
  await page.locator('[aria-label="新 增"] [placeholder="请选择 所属部门"]').click();
  await page.locator('.el-select-dropdown.el-popper:visible').locator('.el-select-dropdown__item').nth(0).click();
  await new FORM.Search(page, '[aria-label="新 增"] [content="请输入 车间负责人"] .el-input-group__append').open(
    '/api/blade-system/user/page',
    '选择用户管理信息（双击进行选择）',
    1
  );

  await page.locator(`[aria-label="新 增"] .avue-dialog__footer .el-button--primary:visible`).click();
  // 验证;
  await expect(page.locator('text=操作成功')).toBeVisible();
  return {
    name,
    code
  };
};

// 生成产线
const createLine = async (page, { name, code, workshopName }) => {
  console.log(name, code, workshopName);
  await page.goto(`/#/product/productionline`);
  await page.getByRole('button', { name: ' 新 增' }).click();
  await page.locator('[aria-label="新 增"] [placeholder="请输入 产线编码"]').fill(code);
  await page.locator('[aria-label="新 增"] [placeholder="请输入 产线名称"]').fill(name);
  await new FORM.Select(page, '[aria-label="新 增"] [placeholder="请选择 车间名称"]').setValue(workshopName);
  await page.locator(`[aria-label="新 增"] .avue-dialog__footer .el-button--primary:visible`).click();
  // 验证;
  await expect(page.locator('text=添加产线成功!')).toBeVisible();
  return {
    name,
    code
  };
};

// 生成工单
const createWO = async (page) => {
  await page.goto(`/#/product/workorder`);
  // 步骤
  await page.getByRole('button', { name: ' 新增工单 ' }).click();
  await page.locator('.orderDropDownMenu .el-dropdown-menu__item').getByText('生产工单').click();

  // await new FORM.Search(page, '[aria-label="新增生产工单"] [content="请输入 客户名称"] .el-input-group__append').open(
  //   '/api/mes-admin/customer/page',
  //   '选择客户信息（双击进行选择）'
  // );

  await new FORM.Search(page, '[aria-label="新增生产工单"] [content="请选择 产品编码"] .el-input-group__append').open(
    '/api/mes-admin/part-master/page',
    '选择产品信息（双击进行选择）',
    1
  );

  await page.locator('[aria-label="新增生产工单"] [placeholder="请输入 生产批次"]').fill('100');
  await page.locator('[aria-label="新增生产工单"] [placeholder="请输入 工单计划数量"]').fill('100');
  await page.locator('[aria-label="新增生产工单"] [placeholder="请输入 计划投入数"]').fill('100');

  await new FORM.DateTime(page, '[aria-label="新增生产工单"] [placeholder="请选择 计划开始时间"]').submit();
  await new FORM.DateTime(page, '[aria-label="新增生产工单"] [placeholder="请选择 计划完成时间"]').submit();

  await page.locator('[aria-label="新增生产工单"] [placeholder="请输入 备注"]').fill('新增生产工单备注');

  await page.locator('.addWorkOrderBtn').click();
  // 验证;
  await expect(page.locator('text=操作成功')).toBeVisible();

  let data = await getDataList(page, '/api/mes-product/work-order/page');
  return data.data[0];
};

// 生成工段
const createSection = async (page, poductSectionName, sectionName) => {
  await page.goto(`/#/product/sectionDefinition`);
  // 步骤
  // 1.新增生产工段
  await page.getByRole('button', { name: ' 新 增' }).click();
  await page.locator('[aria-label="新增"] input[placeholder="请输入 生产工段编码"]').fill(poductSectionName);
  await page.locator('[aria-label="新增"] input[placeholder="请输入 生产工段名称"]').fill(poductSectionName);
  await page.locator('[aria-label="新增"] textarea[placeholder="请输入 备注"]').fill('生产工段gz备注');

  // 绑定产线
  await page.locator('[aria-label="新增"] .el-icon-plus:visible').click();
  await page.waitForResponse((res) => res.url().includes('/api/mes-product/product/line/list') && res.status() === 200);
  await page.waitForTimeout(1000);
  let selectLineLen = await page.locator('[aria-label="选择产线"] td .el-checkbox__input:not(.is-disabled):visible').count();
  console.log(selectLineLen, 'selectLineLen');
  if (selectLineLen > 0) {
    await page.locator('[aria-label="选择产线"] td .el-checkbox__input:not(.is-disabled):visible').nth(0).click();
    await page.locator('[aria-label="选择产线"] .el-transfer-button button').nth(1).click();
    await page.locator('[aria-label="选择产线"] .el-dialog__footer .el-button--primary:visible').click();
    await page.locator('[aria-label="新增"] .el-dialog__footer .el-button--primary:visible').click();

    // 2.新增产品工段
    await page.locator('#tab-1').click();
    await page.getByRole('button', { name: '新 增' }).click();
    await page.locator('[aria-label="新 增"] input[placeholder="请输入 产品工段编码"]').fill(sectionName);
    await page.locator('[aria-label="新 增"] input[placeholder="请输入 产品工段名称"]').fill(sectionName);
    await new FORM.Select(page, '[aria-label="新 增"] [placeholder="请选择 关联生产工段"]').setValue(poductSectionName);
    await page.locator('[aria-label="新 增"] [content="请选择 颜色标识"] .el-input-group__append').click();
    await page.locator('.el-color-dropdown .el-color-dropdown__btns .el-button--default').click();
    await page.locator('[aria-label="新 增"] [content="请输入 异常间隔时间判定"] .el-input-number__increase').click();
    await page.locator('[aria-label="新 增"] .avue-dialog__footer .el-button--primary:visible').click();

    let data = await getDataList(page, '/api/mes-product/work-section/page');
    return data.data[0];
  } else {
    console.log('没有可绑定的产线!');
  }
};

// 指定产品绑定工段
const createProductSection = async (page, productPartNo, sectionName) => {
  await page.goto(`/#/product/productSectionConfig`);
  // 判断是否已经存在产品绑定工段
  await page.locator('[placeholder="请输入 产品编码"]').fill(productPartNo);
  await page.locator('.avue-form .el-form-item__content .el-button--primary').click();

  let data = await getDataList(page, `/api/mes-product/part-master-section/page?productPartNo=${productPartNo}&isLastest=true&current=1&size=20`);
  if (data.data && data.data.length > 0) {
    // 编辑
    await page.locator('.el-table__fixed-right .el-table__fixed-body-wrapper .el-table__row .el-icon-edit').first().click();
    let data1 = await getDataList(page, `/api/mes-product/part-master-section/detail-by-product-part-id?productPartId=${data.data[0].productPartId}`);
    console.log(data1.result.length, '查询产品工段已配置工段数量');

    await page.locator(`[aria-label="编辑"] [content="请输入 工段"] .el-icon-plus:visible`).click();
    await page.locator(`[aria-label="编辑"] [placeholder="请选择 工段${data1.result.length + 1}"]:visible`).click();
    await page.locator('.sectionCascaderPopper .el-cascader-node__label:visible').getByText(sectionName).click();
    await page.locator('[aria-label="编辑"] textarea[placeholder="请输入 备注"]').fill('tab测试产品工段配置');

    await page.locator(`[aria-label="编辑"] .el-dialog__footer .el-button--primary:visible`).click();
    await expect(page.locator('text=操作成功')).toBeVisible();
  } else {
    // 新增
    await page.getByRole('button', { name: '新 增' }).click();
    await page.locator(`[aria-label="新增"] [content="请选择 产品编码"] .el-input-group__append`).click();
    await page.waitForResponse((res) => res.url().includes('/api/mes-admin/part-master/page') && res.status() === 200);
    await page.waitForTimeout(1000);
    await page.locator(`[aria-label="选择产品信息（双击进行选择）"] [placeholder="请输入 产品编码"]`).fill(productPartNo);
    await page.locator(`[aria-label="选择产品信息（双击进行选择）"] .el-form-item__content .el-button--primary`).click();
    await page.waitForTimeout(1000);
    await page.locator(`[aria-label="选择产品信息（双击进行选择）"] .el-table__body .el-table__row`).nth(0).dblclick();

    await page.locator('[aria-label="新增"] [placeholder="请选择 工段1"]:visible').click();
    await page.locator('.sectionCascaderPopper .el-cascader-node__label:visible').getByText(sectionName).click();
    await page.locator('[aria-label="新增"] textarea[placeholder="请输入 备注"]').fill('tab测试产品工段配置');

    await page.getByRole('button', { name: '保 存' }).click();
  }
};

// 生成工站
const createStation = async (page, stationType, sectionName, index) => {
  await page.goto(`/#/product/model-manage/station-manage`);
  await page.getByRole('button', { name: ' 新增' }).click();
  await page.waitForResponse((res) => res.url().includes('/api/mes-product/apaas/workstation/template/select') && res.status() === 200);
  await page.waitForTimeout(1000);
  let date = new Date().getTime();
  await page.locator('input[name="zhCnName"]').fill(stationType + date);
  // 选择工站类型
  await page.getByLabel('基本信息').getByPlaceholder('请选择').click();
  await page.locator('.stationTypePopper li:visible').filter({ hasText: stationType }).click();
  // 图标
  await page
    .locator('div')
    .filter({ hasText: /^选择图标$/ })
    .nth(1)
    .click();
  await page.locator('.stationIconList > div').nth(index).dblclick();

  // 拖拽第一个容器
  await dragDom(page, page.locator('.row-left #col_12'), page.locator('.row-center .designer-div'));
  await page.waitForTimeout(1000);
  //拖拽图片
  await dragDom(page, page.locator('.row-left #picture'), page.locator('.row-center .designer-div .col_content .designer-item'));
  await page.waitForTimeout(1000);

  // 保存
  await page.getByRole('button', { name: ' 保存' }).click();
  await page.waitForTimeout(1000);
  await page.locator('li').filter({ hasText: '返回' }).click();
  await page.waitForTimeout(1000);
  await page.locator('.avue-form__group .el-form-item__content .el-icon-search:visible').click();
  await page.waitForResponse((res) => res.url().includes('/api/mes-product/apaasworkstation/page') && res.status() === 200);
  await page.waitForTimeout(1000);
  // 设置所属工段
  await page.locator('.el-table__fixed-right .el-table__fixed-body-wrapper .el-table__row .el-icon-setting').first().click();
  await page.waitForResponse((res) => res.url().includes('/api/mes-product/work-section/all-section') && res.status() === 200);
  await page.waitForTimeout(2000);
  await page.locator('[aria-label="所属工段"] [placeholder="请选择所属工段"]').click();
  await page.locator('.sectionPopper .el-cascader-node__label:visible').filter({ hasText: sectionName }).click();
  await page.locator('[aria-label="所属工段"] .dialog-footer .el-button--primary').click();

  let data = await getDataList(page, '/api/mes-product/apaasworkstation/page');

  console.log(`${stationType} 工站创建完成`);
  return data.data[0];
};

// 配置生产日历
const createCalendar = async (page, workTimeName, calendarName, poductSectionName) => {
  await page.goto(`/#/product/productCalendar`);
  await page.locator('.calendar-menu button').click();
  await page.waitForResponse((res) => res.url().includes('/api/mes-product/calendar/page-query-calendar-day-template') && res.status() === 200);
  await page.waitForTimeout(1000);
  await page.locator(`[aria-labelledby="tab-1"] .avue-crud__left button`).click();
  await page.locator(`[aria-label="新增"] [placeholder="请输入作业时间方案"]`).fill(workTimeName);
  await page.locator(`[aria-label="新增"] [placeholder="请输入作业时间编码"]`).fill(workTimeName);
  await new FORM.Time(page, '[aria-label="新增"] [placeholder="选择开始时间"]').setValue('08:00');
  await new FORM.Time(page, '[aria-label="新增"] [placeholder="选择结束时间"]').submit();
  await new FORM.Select(page, '[aria-label="新增"] [placeholder="请选择星期"]').setValue('周一');
  await page.locator(`[aria-label="新增"] .el-dialog__footer .el-button--primary:visible`).click();
  await expect(page.locator('text=新增成功')).toBeVisible();

  await page.locator(`[aria-label="作业时间设置"] #tab-2`).click();
  await page.waitForResponse((res) => res.url().includes('/api/mes-product/calendar/page') && res.status() === 200);
  await page.waitForTimeout(1000);
  await page.locator(`[aria-labelledby="tab-2"] .avue-crud__left button`).click();
  await page.locator(`[aria-label="新 增"] [placeholder="请输入 日历方案"]`).fill(calendarName);
  await page.locator(`[aria-label="新 增"] [placeholder="请输入 日历编码"]`).fill(calendarName);
  await page.locator(`[aria-label="新 增"] [placeholder="请选择 开始日期"]`).click();
  await page.locator(`.el-picker-panel__sidebar .el-picker-panel__shortcut:visible`).nth(1).click();
  await page.waitForTimeout(1000);
  await page.locator(`[aria-label="新 增"] [placeholder="请选择 结束日期"]`).click();
  await page.locator(`.el-picker-panel__sidebar .el-picker-panel__shortcut:visible`).nth(1).click();
  await page.locator(`[aria-label="新 增"] [placeholder="请选择 使用工段"]`).click();
  await page.locator(`.el-select-dropdown__item:has-text("${poductSectionName}")`).nth(0).click();
  await page.locator(`[aria-label="新 增"] [placeholder="请输入 日历方案"]`).click();
  await new FORM.Select(page, '[aria-label="新 增"] [placeholder="请选择 作业时间方案"]').setValue(workTimeName);
  await page.locator(`[aria-label="新 增"] .avue-dialog__footer .el-button--primary:visible`).click();

  await page.locator(`[aria-label="作业时间设置"] .el-dialog__footer .el-button--primary:visible`).click();
};
// 获取分页请求数据的方法
const getDataList = async (page, url) => {
  const promise = await page.waitForResponse((res) => {
    return res.url().includes(url);
  });
  const res = await promise;
  const data = await res.json();
  return {
    length: data.data.total,
    data: data.data.records,
    result: data.data
  };
};
